#ifndef _WX_GENERIC_CHOICDGG_H_
#define _WX_GENERIC_CHOICDGG_H_

#include "wx/dynarray.h"
#include "wx/dialog.h"

class wxListBoxBase;

#define wxCHOICE_HEIGHT 150
#define wxCHOICE_WIDTH 200
#define wxCHOICEDLG_STYLE \
  (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE)

class wxAnyChoiceDialog : public wxDialog {
  public:
    wxAnyChoiceDialog() { }

    wxAnyChoiceDialog( wxWindow *parent, const wxString& message, const wxString& caption, int n, const wxString *choices,
                       long styleDlg = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition,
                       long styleLbox = wxLB_ALWAYS_SB ) {
      ( void )Create( parent, message, caption, n, choices,
                      styleDlg, pos, styleLbox );
    }
    wxAnyChoiceDialog( wxWindow *parent, const wxString& message, const wxString& caption, const wxArrayString& choices,
                       long styleDlg = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition,
                       long styleLbox = wxLB_ALWAYS_SB ) {
      ( void )Create( parent, message, caption, choices, styleDlg, pos, styleLbox );
    }

    bool Create( wxWindow *parent, const wxString& message, const wxString& caption, int n, const wxString *choices,
                 long styleDlg = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition, long styleLbox = wxLB_ALWAYS_SB );
    bool Create( wxWindow *parent, const wxString& message, const wxString& caption, const wxArrayString& choices,
                 long styleDlg = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition, long styleLbox = wxLB_ALWAYS_SB );

  protected:
    wxListBoxBase *m_listbox;

    virtual wxListBoxBase *CreateList( int n, const wxString *choices, long styleLbox );

    DECLARE_NO_COPY_CLASS( wxAnyChoiceDialog )
};

class wxSingleChoiceDialog : public wxAnyChoiceDialog {
  public:
    wxSingleChoiceDialog() {
      m_selection = -1;
    }

    wxSingleChoiceDialog( wxWindow *parent, const wxString& message, const wxString& caption, int n,
                          const wxString *choices, char **clientData = ( char ** )NULL, long style = wxCHOICEDLG_STYLE,
                          const wxPoint& pos = wxDefaultPosition );
    wxSingleChoiceDialog( wxWindow *parent, const wxString& message, const wxString& caption,
                          const wxArrayString& choices, char **clientData = ( char ** )NULL, long style = wxCHOICEDLG_STYLE,
                          const wxPoint& pos = wxDefaultPosition );

    bool Create( wxWindow *parent, const wxString& message, const wxString& caption, int n, const wxString *choices,
                 char **clientData = ( char ** )NULL, long style = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition );
    bool Create( wxWindow *parent, const wxString& message, const wxString& caption, const wxArrayString& choices,
                 char **clientData = ( char ** )NULL, long style = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition );

    void SetSelection( int sel );
    int GetSelection() const { return m_selection; }
    wxString GetStringSelection() const { return m_stringSelection; }
    char *GetSelectionClientData() const { return ( char * )m_clientData; }
    void OnOK( wxCommandEvent& event );
    #ifndef __SMARTPHONE__
    void OnListBoxDClick( wxCommandEvent& event );
    #endif
  protected:
    int         m_selection;
    wxString    m_stringSelection;

    void DoChoice();

  private:
    DECLARE_DYNAMIC_CLASS_NO_COPY( wxSingleChoiceDialog )
    DECLARE_EVENT_TABLE()
};

class wxMultiChoiceDialog : public wxAnyChoiceDialog {
  public:
    wxMultiChoiceDialog() { }

    wxMultiChoiceDialog( wxWindow *parent, const wxString& message, const wxString& caption,
                         int n, const wxString *choices, long style = wxCHOICEDLG_STYLE,
                         const wxPoint& pos = wxDefaultPosition ) {
      ( void )Create( parent, message, caption, n, choices, style, pos );
    }
    wxMultiChoiceDialog( wxWindow *parent, const wxString& message, const wxString& caption,
                         const wxArrayString& choices, long style = wxCHOICEDLG_STYLE,
                         const wxPoint& pos = wxDefaultPosition ) {
      ( void )Create( parent, message, caption, choices, style, pos );
    }

    bool Create( wxWindow *parent, const wxString& message, const wxString& caption, int n,
                 const wxString *choices, long style = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition );
    bool Create( wxWindow *parent, const wxString& message, const wxString& caption, const wxArrayString& choices,
                 long style = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition );

    void SetSelections( const wxArrayInt& selections );
    wxArrayInt GetSelections() const { return m_selections; }
    virtual bool TransferDataFromWindow();

  protected:
    #if wxUSE_CHECKLISTBOX
    virtual wxListBoxBase *CreateList( int n, const wxString *choices, long styleLbox );
    #endif // wxUSE_CHECKLISTBOX

    wxArrayInt m_selections;

  private:
    DECLARE_DYNAMIC_CLASS_NO_COPY( wxMultiChoiceDialog )
};

wxString wxGetSingleChoice( const wxString& message, const wxString& caption, const wxArrayString& choices,
                            wxWindow *parent = NULL, int x = wxDefaultCoord, int y = wxDefaultCoord,
                            bool centre = true, int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT );

wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n, const wxString *choices,
                            wxWindow *parent = NULL, int x = wxDefaultCoord, int y = wxDefaultCoord,
                            bool centre = true, int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT );

int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, const wxArrayString& choices,
                            wxWindow *parent = NULL, int x = wxDefaultCoord, int y = wxDefaultCoord,
                            bool centre = true, int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT );

int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n, const wxString *choices,
                            wxWindow *parent = NULL, int x = wxDefaultCoord, int y = wxDefaultCoord,
                            bool centre = true, int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT );

void* wxGetSingleChoiceData( const wxString& message, const wxString& caption, const wxArrayString& choices,
                             void **client_data, wxWindow *parent = NULL, int x = wxDefaultCoord,
                             int y = wxDefaultCoord, bool centre = true, int width = wxCHOICE_WIDTH,
                             int height = wxCHOICE_HEIGHT );

void* wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n, const wxString *choices,
                             void **client_data, wxWindow *parent = NULL, int x = wxDefaultCoord,
                             int y = wxDefaultCoord, bool centre = true, int width = wxCHOICE_WIDTH,
                             int height = wxCHOICE_HEIGHT );

size_t wxGetMultipleChoices( wxArrayInt& selections, const wxString& message, const wxString& caption,
                             int n, const wxString *choices, wxWindow *parent = NULL, int x = wxDefaultCoord,
                             int y = wxDefaultCoord, bool centre = true, int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT );

size_t wxGetMultipleChoices( wxArrayInt& selections, const wxString& message, const wxString& caption,
                             const wxArrayString& choices, wxWindow *parent = NULL, int x = wxDefaultCoord,
                             int y = wxDefaultCoord, bool centre = true, int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT );

#endif // _WX_GENERIC_CHOICDGG_H_
